package com.apexsoft.monitor.utils;

import com.apexsoft.monitor.common.CacheLoad.MonitorCacheLoad;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.LoadingCache;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;


public class GuavaCacheHelper {

    /**
     * 创建一个缓存实例
     */
    private final static LoadingCache<String,Object> cache = CacheBuilder.newBuilder()
            //初始缓存大小
            .initialCapacity(100)
            .concurrencyLevel(3)
            .build(new MonitorCacheLoad());

    /**
     * 缓存数据转为Map结构
     * @return
     */
    public static Map toMap(){
        return cache.asMap();
    }

    /**
     * 更新Key
     * @param key
     */
    public static void update(String key){
        cache.refresh(key);
    }

    /**
     * 获取key对应的值
     * @param key
     * @return
     */
    public static Object get(String key){
        try {
            return cache.get(key);
        } catch (ExecutionException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取多个key对应的值
     * @param keys
     * @return
     */
    public static Map getAll(List keys){
        try {
            return cache.getAll(keys);
        } catch (ExecutionException e) {
            e.printStackTrace();
            return new HashMap();
        }
    }


    /**
     * 设置某个缓存
     * @param key
     * @param value
     */
    public static void set(String key,Object value){
        cache.put(key,value);
    }

    /**
     * 将map的数据全部存为缓存
     * @param map
     */
    public static void setAll(Map map){
        cache.putAll(map);
    }

    /**
     * 移除单个缓存数据
     * @param key
     */
    public static void remove(String key){
        cache.invalidate(key);
    }

    /**
     * 批量移除缓存数据
     * @param keys
     */
    public static void removeKeys(List keys){
        cache.invalidateAll(keys);
    }

    /**
     * 移除所有缓存数据
     */
    public static void removeAll(){
        cache.invalidateAll();
    }

    /**
     * 获取缓存数据个数
     * @return
     */
    public long size(){
        return cache.size();
    }

}
